home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / ldapjdk.jar / netscape / ldap / LDAPCache.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-13  |  6.1 KB  |  316 lines

  1. package netscape.ldap;
  2.  
  3. import java.util.Date;
  4. import java.util.Enumeration;
  5. import java.util.EventObject;
  6. import java.util.Hashtable;
  7. import java.util.Vector;
  8. import java.util.zip.CRC32;
  9. import netscape.ldap.util.DN;
  10.  
  11. public class LDAPCache implements TimerEventListener {
  12.    private Hashtable m_cache;
  13.    private long m_timeToLive;
  14.    private long m_maxSize;
  15.    private String[] m_dns;
  16.    private Vector m_orderedStruct;
  17.    private long m_remainingSize;
  18.    public static final String DELIM = "#";
  19.    private Timer m_timer;
  20.    private static long TIMEOUT = 60000L;
  21.    private long m_totalOpers;
  22.    private static final boolean m_debug = false;
  23.    private long m_hits;
  24.    private long m_flushes;
  25.  
  26.    public LDAPCache(long var1, long var3) {
  27.       this.init(var1, var3);
  28.    }
  29.  
  30.    public LDAPCache(long var1, long var3, String[] var5) {
  31.       this.init(var1, var3);
  32.       this.m_dns = new String[var5.length];
  33.       if (var5 != null && var5.length > 0) {
  34.          for(int var6 = 0; var6 < var5.length; ++var6) {
  35.             this.m_dns[var6] = (new DN(var5[var6])).toString();
  36.          }
  37.       }
  38.  
  39.    }
  40.  
  41.    public long getSize() {
  42.       return this.m_maxSize;
  43.    }
  44.  
  45.    public long getTimeToLive() {
  46.       return this.m_timeToLive / 1000L;
  47.    }
  48.  
  49.    public String[] getBaseDNs() {
  50.       return this.m_dns;
  51.    }
  52.  
  53.    public synchronized boolean flushEntries(String var1, int var2) {
  54.       if (var1 == null) {
  55.          this.m_remainingSize = this.m_maxSize;
  56.          this.m_cache.clear();
  57.          this.m_orderedStruct.removeAllElements();
  58.          return true;
  59.       } else {
  60.          DN var3 = new DN(var1);
  61.          Enumeration var4 = this.m_cache.keys();
  62.  
  63.          while(var4.hasMoreElements()) {
  64.             Long var5 = (Long)var4.nextElement();
  65.             Vector var6 = (Vector)this.m_cache.get(var5);
  66.             int var7 = 1;
  67.  
  68.             int var8;
  69.             for(var8 = var6.size(); var7 < var8; ++var7) {
  70.                String var9 = ((LDAPEntry)var6.elementAt(var7)).getDN();
  71.                DN var10 = new DN(var9);
  72.                if (var3.toRFCString().toUpperCase().equals(var10.toRFCString().toUpperCase())) {
  73.                   break;
  74.                }
  75.  
  76.                if (var2 == 1) {
  77.                   DN var11 = var10.getParent();
  78.                   if (var3.toRFCString().toUpperCase().equals(var11.toRFCString().toUpperCase())) {
  79.                      break;
  80.                   }
  81.                }
  82.  
  83.                if (var2 == 2 && var10.contains(var3)) {
  84.                   break;
  85.                }
  86.             }
  87.  
  88.             if (var7 < var8) {
  89.                for(int var12 = 0; var12 < this.m_orderedStruct.size(); ++var12) {
  90.                   Vector var13 = (Vector)this.m_orderedStruct.elementAt(var12);
  91.                   if (var5.equals((Long)var13.elementAt(0))) {
  92.                      this.m_orderedStruct.removeElementAt(var12);
  93.                      break;
  94.                   }
  95.                }
  96.  
  97.                this.m_cache.remove(var5);
  98.                return true;
  99.             }
  100.          }
  101.  
  102.          return false;
  103.       }
  104.    }
  105.  
  106.    public void timerExpired(TimerEvent var1) {
  107.       this.flushEntries();
  108.       Timer var2 = (Timer)((EventObject)var1).getSource();
  109.       var2.start();
  110.    }
  111.  
  112.    public long getAvailableSize() {
  113.       return this.m_remainingSize;
  114.    }
  115.  
  116.    public long getTotalOperations() {
  117.       return this.m_totalOpers;
  118.    }
  119.  
  120.    public long getNumMisses() {
  121.       return this.m_totalOpers - this.m_hits;
  122.    }
  123.  
  124.    public long getNumHits() {
  125.       return this.m_hits;
  126.    }
  127.  
  128.    public long getNumFlushes() {
  129.       return this.m_flushes;
  130.    }
  131.  
  132.    Long createKey(String var1, int var2, String var3, String var4, int var5, String[] var6, String var7, LDAPSearchConstraints var8) throws LDAPException {
  133.       DN var9 = new DN(var3);
  134.       var3 = var9.toString();
  135.       if (this.m_dns != null) {
  136.          int var10;
  137.          for(var10 = 0; var10 < this.m_dns.length && !var3.equals(this.m_dns[var10]); ++var10) {
  138.          }
  139.  
  140.          if (var10 >= this.m_dns.length) {
  141.             throw new LDAPException(var3 + " is not a cached base DN", 80);
  142.          }
  143.       }
  144.  
  145.       Object var18 = null;
  146.       String var19 = var3 == null ? "null#" : var3.trim() + "#";
  147.       var19 = var19 + var5 + "#";
  148.       var19 = var19 + (var1 == null ? "null#" : var1.trim() + "#");
  149.       var19 = var19 + var2 + "#";
  150.       var19 = var19 + (var4 == null ? "null#" : var4.trim() + "#");
  151.       var19 = var19 + this.appendString(var6);
  152.       var19 = var19 + (var7 == null ? "null#" : var7.trim() + "#");
  153.       LDAPControl[] var11 = null;
  154.       LDAPControl[] var12 = null;
  155.       if (var8 != null) {
  156.          var11 = var8.getServerControls();
  157.          var12 = var8.getClientControls();
  158.       }
  159.  
  160.       if (var11 != null && var11.length > 0) {
  161.          String[] var13 = new String[var11.length];
  162.  
  163.          for(int var14 = 0; var14 < var11.length; ++var14) {
  164.             long var15 = this.getCRC32(var11[var14].getValue());
  165.             var13[var14] = (new Long(var15)).toString();
  166.          }
  167.  
  168.          var19 = var19 + this.appendString(var13);
  169.       } else {
  170.          var19 = var19 + 0 + "#";
  171.       }
  172.  
  173.       if (var12 != null && var12.length > 0) {
  174.          String[] var28 = new String[var12.length];
  175.  
  176.          for(int var30 = 0; var30 < var12.length; ++var30) {
  177.             long var31 = this.getCRC32(var12[var30].getValue());
  178.             var28[var30] = (new Long(var31)).toString();
  179.          }
  180.  
  181.          var19 = var19 + this.appendString(var28);
  182.       } else {
  183.          var19 = var19 + 0 + "#";
  184.       }
  185.  
  186.       long var29 = this.getCRC32(var19.getBytes());
  187.       return new Long(var29);
  188.    }
  189.  
  190.    synchronized Object getEntry(Long var1) {
  191.       Object var2 = null;
  192.       var2 = this.m_cache.get(var1);
  193.       ++this.m_totalOpers;
  194.       if (var2 != null) {
  195.          ++this.m_hits;
  196.       }
  197.  
  198.       return var2;
  199.    }
  200.  
  201.    synchronized void flushEntries() {
  202.       Object var1 = null;
  203.       Date var2 = new Date();
  204.       long var3 = var2.getTime();
  205.  
  206.       for(this.m_flushes = 0L; this.m_orderedStruct.size() > 0; ++this.m_flushes) {
  207.          Vector var9 = (Vector)this.m_orderedStruct.firstElement();
  208.          long var5 = var3 - (Long)var9.elementAt(1);
  209.          if (var5 < this.m_timeToLive) {
  210.             break;
  211.          }
  212.  
  213.          Long var7 = (Long)var9.elementAt(0);
  214.          Vector var8 = (Vector)this.m_cache.remove(var7);
  215.          this.m_remainingSize += (Long)var8.firstElement();
  216.          this.m_orderedStruct.removeElementAt(0);
  217.       }
  218.  
  219.    }
  220.  
  221.    synchronized void addEntry(Long var1, Object var2) throws LDAPException {
  222.       if (this.m_cache.get(var1) == null) {
  223.          Vector var3 = (Vector)var2;
  224.          long var4 = (Long)var3.elementAt(0) + 4L;
  225.          if (var4 > this.m_maxSize) {
  226.             throw new LDAPException("Failed to add an entry to the cache since the new entry exceeds the cache size", 80);
  227.          } else {
  228.             var3.setElementAt(new Long(var4), 0);
  229.             if (var4 > this.m_remainingSize) {
  230.                do {
  231.                   Vector var6 = (Vector)this.m_orderedStruct.firstElement();
  232.                   Long var7 = (Long)var6.elementAt(0);
  233.                   Vector var8 = (Vector)this.m_cache.remove(var7);
  234.                   this.m_orderedStruct.removeElementAt(0);
  235.                   this.m_remainingSize += (Long)var8.elementAt(0);
  236.                } while(this.m_remainingSize < var4);
  237.             }
  238.  
  239.             this.m_remainingSize -= var4;
  240.             this.m_cache.put(var1, var3);
  241.             Vector var9 = new Vector();
  242.             var9.addElement(var1);
  243.             Date var10 = new Date();
  244.             var9.addElement(new Long(var10.getTime()));
  245.             this.m_orderedStruct.addElement(var9);
  246.          }
  247.       }
  248.    }
  249.  
  250.    int size() {
  251.       return this.m_cache.size();
  252.    }
  253.  
  254.    void cleanup() {
  255.       this.m_timer.stop();
  256.    }
  257.  
  258.    private void init(long var1, long var3) {
  259.       this.m_cache = new Hashtable();
  260.       this.m_timeToLive = var1 * 1000L;
  261.       this.m_maxSize = var3;
  262.       this.m_remainingSize = var3;
  263.       this.m_dns = null;
  264.       this.m_orderedStruct = new Vector();
  265.       this.m_timer = new Timer(TIMEOUT);
  266.       this.m_timer.addTimerExpiredEventListener(this);
  267.       this.m_timer.start();
  268.    }
  269.  
  270.    private String appendString(String var1) {
  271.       return var1 == null ? "null#" : var1.trim() + "#";
  272.    }
  273.  
  274.    private String appendString(int var1) {
  275.       return var1 + "#";
  276.    }
  277.  
  278.    private String appendString(String[] var1) {
  279.       if (var1 != null && var1.length >= 1) {
  280.          this.sortStrings(var1);
  281.          String var2 = var1.length + "#";
  282.  
  283.          for(int var3 = 0; var3 < var1.length; ++var3) {
  284.             var2 = var2 + var1[var3].trim() + "#";
  285.          }
  286.  
  287.          return var2;
  288.       } else {
  289.          return "0#";
  290.       }
  291.    }
  292.  
  293.    private void sortStrings(String[] var1) {
  294.       for(int var2 = 0; var2 < var1.length; ++var2) {
  295.          var1[var2] = var1[var2].trim();
  296.       }
  297.  
  298.       for(int var3 = 0; var3 < var1.length - 1; ++var3) {
  299.          for(int var4 = var3 + 1; var4 < var1.length; ++var4) {
  300.             if (var1[var3].compareTo(var1[var4]) > 0) {
  301.                String var5 = var1[var3];
  302.                var1[var3] = var1[var4];
  303.                var1[var4] = var5;
  304.             }
  305.          }
  306.       }
  307.  
  308.    }
  309.  
  310.    private long getCRC32(byte[] var1) {
  311.       CRC32 var2 = new CRC32();
  312.       var2.update(var1);
  313.       return var2.getValue();
  314.    }
  315. }
  316.